Tensorarrayread ================= 从张量数组中读取指定索引的张量,并将其数据复制到输出。该算子不区分数据类型,适用于所有数据类型。 .. math:: \text{output\_data} = \text{handle\_data}[\text{index}] 该算子会将 `handle_data[index]` 指向的数据复制到 `output_data` 中,复制的大小为 `handle_size[index]` 字节。 输入: - **handle_data** - 张量数组的数据指针数组(void** 类型),每个元素指向一个张量的数据。 - **handle_size** - 每个张量的大小数组(int* 类型),`handle_size[i]` 表示 `handle_data[i]` 指向的数据大小(字节)。 - **index** - 读取的索引(int 类型),指定从 `handle_data` 数组中读取哪个张量。 - **core_mask** - 核掩码(int),仅共享存储版本需要。 输出: - **output_data** - 输出数据指针(void* 类型),包含复制后的数据。 - **output_size** - 输出大小指针(int* 类型),指向存储输出大小的变量。调用后,`*output_size` 会被设置为 `handle_size[index]`。 支持平台: ``FT78NE`` ``MT7004`` .. note:: - FT78NE 支持fp32, int16, int32, cplx64 - MT7004 支持fp16, fp32, int16, int32, cplx64 - 算子会复制数据,输出数据与输入数据独立 - 调用前需要确保 `output_data` 指向的内存空间足够大(至少 `handle_size[index]` 字节) - `index` 必须在 `handle_data` 数组的有效范围内 **共享存储版本:** .. c:function:: void fp_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask) .. c:function:: void hp_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask) .. c:function:: void dp_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask) .. c:function:: void i8_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask) .. c:function:: void i16_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask) .. c:function:: void i32_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask) .. c:function:: void c64_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask) .. c:function:: void c128_tensorarrayread_s(void** handle_data, int* handle_size, int index, void* output_data, int* output_size, int core_mask) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 25 //FT78NE示例 #include #include int main(int argc, char* argv[]) { // 假设在DDR空间 // 张量数组包含3个张量 float *data0 = (float *)0xA0000000; // 第0个张量的数据 float *data1 = (float *)0xA1000000; // 第1个张量的数据 float *data2 = (float *)0xA2000000; // 第2个张量的数据 // 每个张量的大小(字节) int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)}; // 创建数据指针数组 void* handle_data[3] = {data0, data1, data2}; // 输出数据 float *output_data = (float *)0xB0000000; // 需要预先分配足够的内存 int output_size; // 输出大小,调用后会被设置 int index = 1; // 读取第1个张量 int core_mask = 0xff; fp_tensorarrayread_s(handle_data, sizes, index, output_data, &output_size, core_mask); // 此时 output_data 包含 data1 的副本 // output_size == sizes[1] == 1000 * sizeof(float) return 0; } **私有存储版本:** .. c:function:: void fp_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size) .. c:function:: void hp_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size) .. c:function:: void dp_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size) .. c:function:: void i8_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size) .. c:function:: void i16_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size) .. c:function:: void i32_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size) .. c:function:: void c64_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size) .. c:function:: void c128_tensorarrayread_p(void** handle_data, int* handle_size, int index, void* output_data, int* output_size) **C调用示例:** .. code-block:: c :linenos: :emphasize-lines: 20 //FT78NE示例 #include #include int main(int argc, char* argv[]) { // 假设在L2空间 float *data0 = (float *)0x10000000; float *data1 = (float *)0x10001000; float *data2 = (float *)0x10002000; int sizes[3] = {1000 * sizeof(float), 1000 * sizeof(float), 1000 * sizeof(float)}; void* handle_data[3] = {data0, data1, data2}; float *output_data = (float *)0x10003000; // 需要预先分配足够的内存 int output_size; int index = 0; // 读取第0个张量 fp_tensorarrayread_p(handle_data, sizes, index, output_data, &output_size); return 0; }